﻿using NAudio.Vorbis;
using NAudio.Wave;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using 无缝播放器;

namespace 时钟壁纸应用.主要窗口
{

    public partial class 响铃窗口 : Window
    {
        #region 初始化动态类
        音频信息 信息 = new 音频信息();
        器材 器材 = new 器材();
        //文件初始化
        string 当前文件夹路径 = "";
        ArrayList 文件夹名称组 = new ArrayList();
        ArrayList 文件夹路径组 = new ArrayList();
        ArrayList 文件名 = new ArrayList();
        static List<string> 播放列表 = new List<string>();
        static List<int> 循环文件下标 = null;
        static ArrayList 节拍特例;
        Dictionary<string, string> 对应表 = new Dictionary<string, string>();
        Dictionary<string, string> UI对应表 = new Dictionary<string, string>();
        Dictionary<string, string> 过渡文件 = new Dictionary<string, string>();
        Dictionary<string, string> 配置文件 = new Dictionary<string, string>();
        static bool 手动停止 = false;
        static bool 正在拖动进度条 = false;
        流 流 = new 流();
        #endregion
        public 响铃窗口(List<string> 文件组)
        {
            InitializeComponent();
            //读取需要播放的文件路径
            播放列表.Clear();
            foreach (string 文件 in 文件组)
            {
                播放列表.Add(文件);
            }
            信息.循环文件下标.Add(1);
            信息.循环次数 = 0;
            音频流 文件流 = new 音频流();
            流.文件.Add(文件流);
            WaveOutEvent 新播放器 = new WaveOutEvent();
            器材.播放器组.Add(新播放器);
            //在读取新音频时新建线程
            if (信息.线程号 != 流.文件.Count - 1)
            {
                Console.WriteLine($"当前线程{信息.线程号}不等于{流.文件.Count - 1}");
                信息.线程号 = 流.文件.Count - 1;
                Console.WriteLine($"已强行赋值为{信息.线程号}");
            }
            流.文件[信息.线程号].读入音频流(播放列表, 器材, 信息, 流, 提示);
            器材.播放器组[信息.线程号].Play();

        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {

                    信息.章节信息.Clear();

                    信息.播放状态 = 音频信息.音频状态.未定义;
                    信息.淡出_字节修改量 = 0;
                    信息.当前段编号 = 0;
                    信息.播完停止 = false;
                    信息.淡入_字节修改量 = 0;
                    手动停止 = true;
                    器材.播放器组[信息.线程号].Stop();
                    器材.播放器组[信息.线程号] = new WaveOutEvent();
                    try
                    {
                        器材.读取器组.Clear();
                    }
                    catch
                    {
                        try
                        {
                            器材.读取器组[信息.线程号 - 1] = null;
                        }
                        catch
                        {

                        }
                    }
                    if (流.文件.Count > 0)
                    {
                        if (流.文件[信息.线程号].过渡播放器 != null)
                        {
                            流.文件[信息.线程号].过渡播放器 = new WaveOut();
                            流.文件[信息.线程号].过渡播放器.Stop();
                        }

                        if (流.文件[信息.线程号].内存文件组 != null)
                        {
                            流.文件[信息.线程号].内存文件组.Clear();
                            流.文件[信息.线程号].读取器组.Clear();
                            流.文件[信息.线程号].obb读取器组.Clear();

                        }
                        流.文件[信息.线程号].过渡音频 = null;
                        if (流.文件[信息.线程号].过渡文件音频文件读取器 != null)
                        {
                            流.文件[信息.线程号].过渡文件音频文件读取器.Close();
                            流.文件[信息.线程号].过渡文件音频文件读取器.Dispose();
                        }
                    }

                    信息.循环次数 = 0;
                    信息.下一段编号 = 0;
                    信息.当前段编号 = 0;
      
    
                    手动停止 = true;
     


         
            

            while (器材.播放器组[信息.线程号].PlaybackState == PlaybackState.Playing)
            {

                器材.播放器组[信息.线程号].Stop();
                器材.播放器组[信息.线程号] = new WaveOutEvent();
                foreach (var i in 器材.播放器组)
                {
                    i.Dispose();
                }
                if (流.文件.Count != 0)
                {
                    流.文件[信息.线程号].过渡播放器 = new WaveOut();
                    流.文件[信息.线程号].过渡播放器.Stop();
                    流.文件[信息.线程号].内存文件组.Clear();
                    流.文件[信息.线程号].读取器组.Clear();
                    流.文件[信息.线程号].obb读取器组.Clear();
                    Console.WriteLine(流.文件[信息.线程号].内存文件组.Count);
                    if (流.文件[信息.线程号].过渡文件音频文件读取器 != null)
                    {
                        流.文件[信息.线程号].过渡文件音频文件读取器.Close();
                        流.文件[信息.线程号].过渡文件音频文件读取器.Dispose();
                    }
                }
                else
                {
                 

                }
                信息.仍需读取流 = false;
                信息.循环次数 = 0;

                信息.下一段编号 = 0;
                信息.当前段编号 = 0;


            }

        }

        private void 关闭按钮_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}
